Null Object

BankAccount::BankAccount(const shared_ptr<Logger>& logger, const string& name, int balance);
위의 생성자는 인자로 Logger 객체를 전달받는다.
초기화 되지 않은 shared_ptr<Logger>()를 전달하는 방법은 안전하지 못한 방법이다.
(BankAccount가 내부적으로 Logger를 사용하기 전에 포인터 검사를 하는지 알 수 없음)

Logger에 Null 객체를 전달해서 객체가 가진 인터페이스를 모두 준수하면서,
동작을 하지 않도록 구현한다.
struct NullLogger: Logger{
void info(const string& s) override {}
void warn(const string& s) override {}
}